其他
X86指令混淆之函数分析和代码块粉碎
更无法通过F5看伪代码。
这种做法也被大牛们叫做控制流程平坦化,代码块A也叫做控制分发器,负责分发指令跳转。
我没有采用上面的方法,我的基本想法是以函数为单位进行混淆,比如有函数F,抽取出F函数的所有指令,申请一个新的空间将每条指令随机乱序放置在新的空间,再增加指令保证两条指令的执行顺序和原始函数一致,可以采用上面说的复杂算法计算出下一条指令的地址也可以使用直观的跳转指令进行链接。
实现每条指令空间顺序上的随机乱序,但是执行顺序不变,空间上相邻的两条指令之间也可以生成一些大小随机的花指令进行干扰。
使用工具:自己撸的一个PE操作类,反汇编引擎使用的udis86,汇编引擎使用的asmjit
函数分析的意思是,给定一个代码块,识别出函数的起始地址和大小,类似IDA以sub_xxx标注出函数的功能,如图:
1. jmp immediate(立即数)
2. ret结尾识别
3. 其他情况结尾判断
如果遇到向上跳转的无条件jmp指令则函数结束
如果找到nop (0x90)则函数结束
如果找到至少连续两个以上int3 (0xCC)则函数结束
如果找到add [eax], al (0x00,0x00....)则函数结束
函数第一条指令是无条件jmp则函数结束,并把jmp指令目标地址加入待分析函数地址集合
如果下一条指令是另一个函数的开始,(比如遇到指令push esp,mov ebp, esp) 则函数结束,并把下一条指令地址加入待分析函数地址集合
4. Call immediate(立即数)
5. 其他
混淆之前必须先扫描记录当前函数的所有重定位信息,混淆过程中将原始重定位信息和新的重定位信息联系在一起,以便后面进行重定位修复。
发个demo bin玩玩,把Obfuscater.exe和procmon.exe放在同一目录,运行即可生procmon.obf.exe。
Obfuscater.exe处理的exe和函数我都写死了,想用的大佬可以自行逆向patch一下。
看雪ID:三猫
https://bbs.pediy.com/user-784599.htm
推荐文章++++
* 实战栈溢出漏洞
好书推荐